home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / network / atre12.zip / LF.ZIP / FILEDLG.C < prev    next >
C/C++ Source or Header  |  1991-07-05  |  11KB  |  355 lines

  1. /*--------------------------------
  2.    FILEDLG.C -- open and close
  3.                 file dialog boxes
  4. ----------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "filedlg.h"
  8.  
  9. BOOL FAR PASCAL FileOpenDlgProc(HWND, WORD, WORD, LONG);
  10. BOOL FAR PASCAL FileSaveDlgProc(HWND, WORD, WORD, LONG);
  11. BOOL FAR PASCAL OutFileDlgProc (HWND, WORD, WORD, LONG);
  12.  
  13. LPSTR lstrchr  (LPSTR str, char ch);
  14. LPSTR lstrrchr (LPSTR str, char ch);
  15.  
  16. static char      szDefExt[5];
  17. static char      szOutDefExt[5];
  18. static char      szFName[96];
  19. static char      szFileSpec[16];
  20. static char      szOutFileSpec[16];
  21.  
  22. static POFSTRUCT pof;
  23. static WORD      wFileAttr, wStatus;
  24.  
  25. int DoFileOpenDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  26.                    char *szDefExtIn, WORD wFileAttrIn,
  27.                    char *szFNameOut, POFSTRUCT pofIn)
  28.  
  29.     {
  30.     FARPROC lpfnFileOpenDlgProc;
  31.     int     iReturn;
  32.  
  33.     lstrcpy (szFileSpec, szFileSpecIn);
  34.     lstrcpy (szDefExt,   szDefExtIn);
  35.     wFileAttr = wFileAttrIn;
  36.     pof = pofIn;
  37.  
  38.     lpfnFileOpenDlgProc = MakeProcInstance (FileOpenDlgProc, hInst);
  39.  
  40.     iReturn = DialogBox(hInst, "FileOpen", hwnd, lpfnFileOpenDlgProc);
  41.  
  42.     FreeProcInstance(lpfnFileOpenDlgProc);
  43.     lstrcpy(szFNameOut, szFName);
  44.     return iReturn;
  45.     }
  46.  
  47. int DoFileSaveDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  48.                    char *szDefExtIn, WORD *pwStatusOut,
  49.                    char *szFNameOut, POFSTRUCT pofIn)
  50.     {
  51.     FARPROC lpfnFileSaveDlgProc;
  52.     int     iReturn;
  53.  
  54.     lstrcpy (szFileSpec, szFileSpecIn);
  55.     lstrcpy (szDefExt,   szDefExtIn);
  56.     pof = pofIn;
  57.     lpfnFileSaveDlgProc = MakeProcInstance (FileSaveDlgProc, hInst);
  58.  
  59.     iReturn = DialogBox(hInst, "FileSave", hwnd, lpfnFileSaveDlgProc);
  60.  
  61.     FreeProcInstance(lpfnFileSaveDlgProc);
  62.     lstrcpy(szFNameOut, szFName);
  63.     *pwStatusOut = wStatus;
  64.     return iReturn;
  65.     }
  66.  
  67. int DoOutFileDlg (HANDLE hInst, HWND hwnd, char *szFileSpecIn,
  68.                    char *szDefExtIn, WORD *pwStatusOut,
  69.                    char *szFNameOut, POFSTRUCT pofIn)
  70.  
  71.     {
  72.     FARPROC lpfnOutFileDlgProc;
  73.     int     iReturn;
  74.  
  75.     lstrcpy (szOutFileSpec, szFileSpecIn);
  76.     lstrcpy (szOutDefExt,   szDefExtIn);
  77.  
  78.     pof = pofIn;
  79.  
  80.     lpfnOutFileDlgProc = MakeProcInstance (OutFileDlgProc, hInst);
  81.  
  82.     iReturn = DialogBox(hInst, "OutFile", hwnd, lpfnOutFileDlgProc);
  83.  
  84.     FreeProcInstance(lpfnOutFileDlgProc);
  85.     lstrcpy(szFNameOut, szFName);
  86.     *pwStatusOut = wStatus;
  87.     return iReturn;
  88.     }
  89.  
  90. BOOL FAR PASCAL FileOpenDlgProc(HWND hDlg, WORD message,
  91.                                 WORD wParam, LONG lParam)
  92.     {
  93.     char cLastChar;
  94.     short nEditLen;
  95.  
  96.     switch (message)
  97.         {
  98.         case WM_INITDIALOG:
  99.             SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L);
  100.             DlgDirList(hDlg, szFileSpec, IDD_FLIST, IDD_FPATH, wFileAttr);
  101.             SetDlgItemText(hDlg, IDD_FNAME, szFileSpec);
  102.             return TRUE;
  103.  
  104.         case WM_COMMAND:
  105.             switch (wParam)
  106.                 {
  107.                 case IDD_FLIST :
  108.                     switch (HIWORD(lParam))
  109.                         {
  110.                         case LBN_SELCHANGE :
  111.                             if (DlgDirSelect (hDlg, (LPSTR)szFName, IDD_FLIST))
  112.                                 lstrcat ((LPSTR)szFName, (LPSTR)szFileSpec);
  113.                             SetDlgItemText(hDlg, IDD_FNAME, szFName);
  114.                             return TRUE;
  115.  
  116.                         case LBN_DBLCLK :
  117.                             if (DlgDirSelect (hDlg, szFName, IDD_FLIST))
  118.                                 {
  119.                                 lstrcat (szFName, szFileSpec);
  120.                                 DlgDirList(hDlg, szFName, IDD_FLIST, IDD_FPATH, wFileAttr);
  121.                                 SetDlgItemText(hDlg, IDD_FNAME, szFileSpec);
  122.                                 }
  123.                             else
  124.                                 {
  125.                                 SetDlgItemText(hDlg, IDD_FNAME, szFName);
  126.                                 SendMessage(hDlg, WM_COMMAND, IDOK, 0L);
  127.                                 }
  128.                             return TRUE;
  129.                         }
  130.                     break;
  131.  
  132.                 case IDD_FNAME:
  133.                     if (HIWORD(lParam) == EN_CHANGE)
  134.                         EnableWindow(GetDlgItem(hDlg, IDOK),
  135.                             (BOOL) SendMessage(LOWORD(lParam),
  136.                                                WM_GETTEXTLENGTH, 0, 0L));
  137.                     return TRUE;
  138.  
  139.                 case IDOK :
  140.                     GetDlgItemText (hDlg, IDD_FNAME, szFName, 80);
  141.  
  142.                     nEditLen = lstrlen(szFName);
  143.                     cLastChar = *AnsiPrev(szFName, szFName + nEditLen);
  144.  
  145.                     if (cLastChar == '\\' || cLastChar == ':')
  146.                         lstrcat(szFName, szFileSpec);
  147.  
  148.                     if(lstrchr(szFName, '*') || lstrchr(szFName, '?'))
  149.                         {
  150.                         if (DlgDirList (hDlg, szFName, IDD_FLIST,
  151.                                         IDD_FPATH, wFileAttr))
  152.                             {
  153.                             lstrcpy(szFileSpec, szFName);
  154.                             SetDlgItemText(hDlg, IDD_FNAME, szFileSpec);
  155.                             }
  156.                         else
  157.                             MessageBeep(0);
  158.  
  159.                         return TRUE;
  160.                         }
  161.  
  162.                     lstrcat (lstrcat(szFName, "\\"), szFileSpec);
  163.  
  164.                     if (DlgDirList (hDlg, szFName, IDD_FLIST,
  165.                                         IDD_FPATH, wFileAttr))
  166.                         {
  167.                         lstrcpy(szFileSpec, szFName);
  168.                         SetDlgItemText(hDlg, IDD_FNAME, szFileSpec);
  169.                         return TRUE;
  170.                         }
  171.  
  172.                     szFName [nEditLen] = '\0';
  173.  
  174.                     if (-1 == OpenFile (szFName, pof, OF_READ | OF_EXIST))
  175.                         {
  176.                         lstrcat (szFName, szDefExt);
  177.                         if (-1 == OpenFile (szFName, pof, OF_READ | OF_EXIST))
  178.                             {
  179.                             MessageBeep(0);
  180.                             return TRUE;
  181.                             }
  182.                         }
  183.                     lstrcpy (szFName,
  184.                              AnsiNext(lstrrchr(pof->szPathName, '\\')));
  185.  
  186.                     OemToAnsi (szFName, szFName);
  187.                     EndDialog(hDlg, TRUE);
  188.                     return TRUE;
  189.  
  190.                 case IDCANCEL :
  191.                     EndDialog(hDlg, FALSE);
  192.                     return TRUE;
  193.  
  194.                 }
  195.  
  196.         }
  197.     return FALSE;
  198.     }
  199.  
  200. BOOL FAR PASCAL FileSaveDlgProc (HWND hDlg, WORD message,
  201.                                  WORD wParam, LONG lParam)
  202.  
  203.     {
  204.     switch (message)
  205.         {
  206.         case WM_INITDIALOG:
  207.             SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L);
  208.             DlgDirList(hDlg, szFileSpec, 0, IDD_FPATH, 0);
  209.             SetDlgItemText(hDlg, IDD_FNAME, szFileSpec);
  210.             return TRUE;
  211.  
  212.         case WM_COMMAND:
  213.             switch(wParam)
  214.                 {
  215.                 case IDD_FNAME:
  216.                     if (HIWORD(lParam) == EN_CHANGE)
  217.                         EnableWindow(GetDlgItem (hDlg, IDOK),
  218.                             (BOOL) SendMessage(LOWORD (lParam),
  219.                                                 WM_GETTEXTLENGTH, 0, 0L));
  220.  
  221.                     return TRUE;
  222.  
  223.                 case IDOK :
  224.                     GetDlgItemText (hDlg, IDD_FNAME, szFName, 80);
  225.  
  226.                     if (-1 == OpenFile (szFName, pof, OF_PARSE))
  227.                         {
  228.                         MessageBeep(0);
  229.                         return TRUE;
  230.                         }
  231.  
  232.                     if (!lstrchr (AnsiNext(lstrrchr(pof->szPathName, '\\')),
  233.                                   '.'))
  234.                         lstrcat (szFName, szDefExt);
  235.  
  236.                     if (-1 != OpenFile (szFName, pof, OF_WRITE | OF_EXIST))
  237.                         wStatus = 1;
  238.  
  239.                     else if (-1 != OpenFile (szFName, pof, OF_CREATE | OF_EXIST))
  240.                         wStatus = 0;
  241.  
  242.                     else
  243.                         {
  244.                         MessageBeep(0);
  245.                         return TRUE;
  246.                         }
  247.  
  248.                     lstrcpy (szFName,
  249.                              AnsiNext(lstrrchr(pof->szPathName, '\\')));
  250.  
  251.  
  252.                     OemToAnsi (szFName, szFName);
  253.                     EndDialog(hDlg, TRUE);
  254.                     return TRUE;
  255.  
  256.                 case IDCANCEL :
  257.                     EndDialog(hDlg, FALSE);
  258.                     return TRUE;
  259.                 }
  260.         }
  261.     return FALSE;
  262.     }
  263.  
  264. BOOL FAR PASCAL OutFileDlgProc (HWND hDlg, WORD message,
  265.                                  WORD wParam, LONG lParam)
  266.     {
  267.     switch (message)
  268.         {
  269.         case WM_INITDIALOG:
  270.             SendDlgItemMessage (hDlg, IDD_FNAME, EM_LIMITTEXT, 80, 0L);
  271.             DlgDirList(hDlg, szOutFileSpec, 0, IDD_FPATH, 0);
  272.             SetDlgItemText(hDlg, IDD_FNAME, szOutFileSpec);
  273.             return TRUE;
  274.  
  275.         case WM_COMMAND:
  276.             switch(wParam)
  277.                 {
  278.                 case IDD_FNAME:
  279.                     if (HIWORD(lParam) == EN_CHANGE)
  280.                         EnableWindow(GetDlgItem (hDlg, IDOK),
  281.                             (BOOL) SendMessage(LOWORD (lParam),
  282.                                                 WM_GETTEXTLENGTH, 0, 0L));
  283.  
  284.                     return TRUE;
  285.  
  286.                 case IDOK :
  287.                     GetDlgItemText (hDlg, IDD_FNAME, szFName, 80);
  288.  
  289.                     if (-1 == OpenFile (szFName, pof, OF_PARSE))
  290.                         {
  291.                         MessageBeep(0);
  292.                         return TRUE;
  293.                         }
  294.  
  295.                     if (!lstrchr (AnsiNext(lstrrchr(pof->szPathName, '\\')),
  296.                                   '.'))
  297.                         lstrcat (szFName, szOutDefExt);
  298.  
  299.                     if (-1 != OpenFile (szFName, pof, OF_WRITE | OF_EXIST))
  300.                         wStatus = 1;
  301.  
  302.                     else if (-1 != OpenFile (szFName, pof, OF_CREATE | OF_EXIST))
  303.                         wStatus = 0;
  304.  
  305.                     else
  306.                         {
  307.                         MessageBeep(0);
  308.                         return TRUE;
  309.                         }
  310.  
  311.                     lstrcpy (szFName,
  312.                              AnsiNext(lstrrchr(pof->szPathName, '\\')));
  313.  
  314.  
  315.                     OemToAnsi (szFName, szFName);
  316.                     EndDialog(hDlg, TRUE);
  317.                     return TRUE;
  318.  
  319.                 case IDCANCEL :
  320.                     EndDialog(hDlg, FALSE);
  321.                     return TRUE;
  322.                 }
  323.         }
  324.     return FALSE;
  325.     }
  326.  
  327.  
  328. LPSTR lstrchr (LPSTR str, char ch)
  329.     {
  330.     while (*str)
  331.         {
  332.         if (ch == *str)
  333.             return str;
  334.  
  335.         str = AnsiNext(str);
  336.         }
  337.     return NULL;
  338.     }
  339.  
  340. LPSTR lstrrchr (LPSTR str, char ch)
  341.     {
  342.     LPSTR strl = str + lstrlen(str);
  343.  
  344.     do
  345.         {
  346.         if (ch == *strl)
  347.             return strl;
  348.  
  349.         strl = AnsiPrev(str, strl);
  350.         }
  351.     while (strl > str);
  352.  
  353.     return NULL;
  354.     }
  355.